package com.lp.easymethodlink.util;

import com.intellij.psi.PsiAnnotation;
import com.intellij.psi.PsiClass;
import com.intellij.psi.PsiMethod;
import com.intellij.psi.PsiAnnotationMemberValue;
import com.intellij.psi.PsiLiteralExpression;

/**
 * PSI注解工具类
 */
public class PsiAnnotationUtils {
    
    /**
     * 获取方法的描述信息（来自注释）
     * @param method 方法
     * @return 描述信息
     */
    public static String getMethodDescription(PsiMethod method) {
        // 获取方法上的注释
        String comment = method.getDocComment() != null ? method.getDocComment().getText() : "";
        // 简单提取注释中的文本内容
        return extractTextFromComment(comment);
    }
    
    /**
     * 从注释中提取文本内容
     * @param comment 注释
     * @return 文本内容
     */
    private static String extractTextFromComment(String comment) {
        if (comment == null || comment.isEmpty()) {
            return "";
        }
        
        // 简单处理，实际应用中可能需要更复杂的解析
        return comment.replaceAll("/\\*+", "")
                     .replaceAll("\\*+/", "")
                     .replaceAll("\\*", "")
                     .trim();
    }
    
    /**
     * 检查类是否有指定注解
     * @param psiClass 类
     * @param annotationName 注解名称
     * @return 是否有指定注解
     */
    public static boolean hasClassAnnotation(PsiClass psiClass, String annotationName) {
        PsiAnnotation[] annotations = psiClass.getAnnotations();
        for (PsiAnnotation annotation : annotations) {
            if (annotationName.equals(annotation.getQualifiedName())) {
                return true;
            }
        }
        return false;
    }
    
    /**
     * 获取类上指定注解的值
     * @param psiClass 类
     * @param annotationName 注解名称
     * @return 注解值
     */
    public static String getClassAnnotationValue(PsiClass psiClass, String annotationName) {
        PsiAnnotation annotation = psiClass.getAnnotation(annotationName);
        if (annotation != null) {
            PsiAnnotationMemberValue value = annotation.findAttributeValue("value");
            if (value instanceof PsiLiteralExpression) {
                Object literalValue = ((PsiLiteralExpression) value).getValue();
                return literalValue != null ? literalValue.toString() : "";
            }
        }
        return "";
    }
    
    /**
     * 获取方法上指定注解的值
     * @param method 方法
     * @param annotationName 注解名称
     * @return 注解值
     */
    public static String getMethodAnnotationValue(PsiMethod method, String annotationName) {
        PsiAnnotation annotation = method.getAnnotation(annotationName);
        if (annotation != null) {
            PsiAnnotationMemberValue value = annotation.findAttributeValue("value");
            if (value instanceof PsiLiteralExpression) {
                Object literalValue = ((PsiLiteralExpression) value).getValue();
                return literalValue != null ? literalValue.toString() : "";
            }
        }
        return "";
    }
}